Финал[Y81] [n2k82]
В листинге 2.25Ниже приведен законченный примерм использования корректирующих кодов на практике, пригодный для решения реальных практических задач.
Листинг 21.25. Пример вызова функций библиотеки ElByECC.DLL из своей программы
/*----------------------------------------------------------------------------
*
* демонстрация ElByECC.DLL
* ========================
*
* данная программа демонстрирует работу с библиотекой ElByECC.DLL,
* генерируя избыточные коды Рида-Соломона на основе пользовательских данных,
* затем умышленно искажает их и вновь восстанавливает.
* количество разрушаемых байтов передается в первом параметре командной
* строки (по умолчанию - 6)
----------------------------------------------------------------------------*/
#include <stdio.h>
#include "ElByECC.h" // декомпилировано МЫЩЪХем
#define _DEF_DMG 6 // рушить по умолчанию
#define N_BYTES_DAMAGE ((argc>1)?atol(argv[1]):_DEF_DMG) // сколько байт
// рушить?
main(int argc, char **argv)
{
int a;
char stub_head[HEADER_SIZE]; // заголовок сектора
char user_data[USER_DATA_SIZE]; // область польз. данных
struct RAW_SECTOR_MODE1 raw_sector_for_damage; // сектор для искажений
struct RAW_SECTOR_MODE1 raw_sector_for_compre; // контрольная копия сект.
// TITLE
//------------------------------------------------------------------------
printf("= ElByECC.DLL usage demo example by KK\n");
// инициализация пользовательских данных
//------------------------------------------------------------------------
printf("user data initialize...............");
for (a = 0; a < USER_DATA_SIZE; a++) user_data[a] = a; // user_data init
memset(stub_head, 0, HEADER_SIZE); stub_head[3] = 1; // src header init
printf("+OK\n");
// генерация кодов Рида- Соломона на основе пользовательских данных
//-----------------------------------------------------------------------
printf("RS-code generate...................");
a = GenECCAndEDC_Mode1(user_data, stub_head, &raw_sector_for_damage);
if (a == ElBy_SECTOR_ERROR) { printf("-ERROR!\x7\n"); return -1;}
memcpy(&raw_sector_for_compre, &raw_sector_for_damage, RAW_SECTOR_SIZE);
printf("+OK\n");
// умышленное искажение пользовательских данных
//------------------------------------------------------------------------
printf("user-data %04d bytes damage........", N_BYTES_DAMAGE);
for (a=0;a<N_BYTES_DAMAGE;a++) raw_sector_for_damage.USER_DATA[a]^=0xFF;
if(!memcmp(&raw_sector_for_damage,&raw_sector_for_compre,RAW_SECTOR_SIZE))
printf("-ERR: NOT DAMAGE YET\n"); else printf("+OK\n");
// проверка целостности пользовательских данных
//------------------------------------------------------------------------
printf("user-data check....................");
a = CheckSector((struct RAW_SECTOR*)&raw_sector_for_damage,ElBy_TEST_ONLY);
if (a==ElBy_SECTOR_OK){
printf("-ERR:data not damage\x7\n");return -1;}printf(".data damge\n");
// восстановление пользовательских данных
//------------------------------------------------------------------------
printf("user-data recorver.................");
a = CheckSector((struct RAW_SECTOR*)&raw_sector_for_damage, ElBy_REPAIR);
if (a == ElBy_SECTOR_ERROR) {
printf("-ERR: NOT RECORVER YET\x7\n"); return -1; } printf("+OK\n");
// проверка успешности восстановления
//------------------------------------------------------------------------
printf("user-data recorver check...........");
if(memcmp(&raw_sector_for_damage,&raw_sector_for_compre,RAW_SECTOR_SIZE))
printf("-ERR: NOT RECORVER YET\x7\n"); else printf("+OK\n");
printf("+OK\n");
return 1;
}